package com.fjwt.gz.proxy.ctrl.blackList;

import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.fjwt.gz.core.model.ApiRes;
import com.fjwt.gz.db.dto.BlacklistRuleDTO;
import com.fjwt.gz.db.vo.BlacklistRuleVO;
import com.fjwt.gz.proxy.ctrl.CommonCtrl;
import com.fjwt.gz.service.impl.BlacklistRuleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * <p>
 * 黑名单规则表 前端控制器
 * </p>
 *
 * @author wangjie
 * @since 2025-05-12
 */
@Slf4j
@RestController
@RequestMapping("/api/blacklistRule")
public class BlacklistRuleController extends CommonCtrl {

    @Autowired
    private BlacklistRuleService blacklistRuleService;


    /**
     * 获取黑名单规则列表
     * @return 规则列表
     */
    @PreAuthorize("hasAnyAuthority('ENT_LIMT_CONDITION_BLACK_RULE')")
    @GetMapping("/list")
    public ApiRes getBlacklistRuleList(){
        BlacklistRuleDTO blacklistRule = getObject(BlacklistRuleDTO.class);
        String agentNo = getCurrentUser().getAgentNo();
        blacklistRule.setAgentNo(checkAgentAuth(agentNo, blacklistRule.getAgentNo()));
        log.info("机构端查询黑名单规则列表接口：/api/blacklistRule/list, 请求参数：{}", JSONUtil.toJsonStr(blacklistRule));
        IPage<BlacklistRuleVO> result = blacklistRuleService.getBlacklistRuleList(getIPage(true), blacklistRule);
        log.info("机构端查询黑名单规则列表接口：/api/blacklistRule/list, 返回结果：{}", JSONUtil.toJsonStr(result));
        return ApiRes.page(result);
    }

    /**
     * 获取所有黑名单规则
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_LIMT_CONDITION_BLACK_INFO', 'ENT_ACTIVITY_LIST_ADD')")
    @GetMapping("/allList")
    public ApiRes getAllBlacklistRuleList(){
        String agentNo = getCurrentUser().getAgentNo();
        List<BlacklistRuleVO> result = blacklistRuleService.getAllRuleList(agentNo);
        log.info("机构端查询所有黑名单规则列表接口：/api/blacklistRule/allList, 返回结果：{}", JSONUtil.toJsonStr(result));
        return ApiRes.ok(result);
    }

    /**
     * 活动根据机构号获取黑名单规则列表
     * @return
     */
    @GetMapping("/getListByAgentNo")
    public ApiRes getListByAgentNo(){
        String agentNo = getValString("agentNo");
        log.info("机构端活动根据机构号获取黑名单规则列表接口：/api/blacklistRule/getListByAgentNo, 传参：{}", agentNo);
        List<BlacklistRuleVO> result = blacklistRuleService.getListByAgentNo(agentNo);
        log.info("机构端活动根据机构号获取黑名单规则列表接口：/api/blacklistRule/getListByAgentNo, 返回结果：{}", JSONUtil.toJsonStr(result));
        return ApiRes.ok(result);
    }

    /**
     * 新增黑名单规则
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_LIMT_CONDITION_BLACK_RULE_ADD')")
    @PostMapping("/add")
    public ApiRes addBlacklistRule(){
        BlacklistRuleDTO ruleDTO = getObject(BlacklistRuleDTO.class);
        ruleDTO.setCreatedUid(getCurrentUser().getSysUserId());
        log.info("机构端新增黑名单规则接口，请求地址：/api/blacklistRule/add, 请求参数：{}", JSONUtil.toJsonStr(ruleDTO));
        blacklistRuleService.addBlacklistRule(ruleDTO);
        return ApiRes.ok();
    }

    /**
     * 查看详情
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_LIMT_CONDITION_BLACK_RULE_VIEW')")
    @PostMapping("/details")
    public ApiRes details(){
        Long blacklistRuleId = getValLongRequired("blacklistRuleId");
        log.info("机构端查看详情接口，请求地址：/api/blacklistRule/details, 请求参数：{}", blacklistRuleId);
        BlacklistRuleVO blacklistRuleVO = blacklistRuleService.getDetailsById(blacklistRuleId);
        log.info("机构端查看详情接口，请求地址：/api/blacklistRule/details, 返回结果：{}", JSONUtil.toJsonStr(blacklistRuleVO));
        return ApiRes.ok(blacklistRuleVO);
    }

    /**
     * 查看配置字段
     * @return
     */
    @PostMapping("/getConfigFields")
    public ApiRes getConfigFields(){
        Long blacklistRuleId = getValLongRequired("blacklistRuleId");
        log.info("pc端查看配置字段接口，请求地址：/api/blacklistRule/getConfigFields, 请求参数：{}", blacklistRuleId);
        return ApiRes.ok(blacklistRuleService.getConfigFields(blacklistRuleId));
    }

    /**
     * 修改黑名单规则
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_LIMT_CONDITION_BLACK_RULE_EDIT')")
    @PostMapping("/update")
    public ApiRes updateBlacklistRule(){
        BlacklistRuleDTO ruleDTO = getObject(BlacklistRuleDTO.class);
        log.info("机构端修改黑名单规则接口，请求地址：/api/blacklistRule/update, 请求参数：{}", JSONUtil.toJsonStr(ruleDTO));
        blacklistRuleService.updateBlacklistRule(ruleDTO);
        return ApiRes.ok();
    }

//    /**
//     * 修改提示语
//     * @return
//     */
//    @PostMapping("/updateTips")
//    public ApiRes updateTips(){
//        BlacklistRuleDTO ruleDTO = getObject(BlacklistRuleDTO.class);
//        log.info("pc端修改黑名单规则接口，请求地址：/api/blacklistRule/updateTips, 请求参数：{}", JSONUtil.toJsonStr(ruleDTO));
//        blacklistRuleService.updateBlacklistRuleTips(ruleDTO);
//        return ApiRes.ok();
//    }

    /**
     * 删除黑名单规则
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_LIMT_CONDITION_BLACK_RULE_DEL')")
    @PostMapping("/delete")
    public ApiRes deleteBlacklistRule(){
        Long blacklistRuleId = getValLong("blacklistRuleId");
        log.info("机构端删除规则名单接口，请求地址：/api/blacklistRule/delete, 传参：{}", blacklistRuleId);
        blacklistRuleService.deleteBlacklistRuleById(blacklistRuleId);
        return ApiRes.ok();
    }
}

